<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <script lang="javascript">
    // JSON.parse(JSON.stringify(obj))的坑

    function Person(name){
      this.name = name
    }
    let obj = {
      motto:'行则将至',
      // date:new Date(),
      // typeU: undefined,
      // fun: function () {
      //   console.log('fun');
      // },
      // type1: NaN,
      // infinity1: 1.7976931348623157E+10308,
      // infiniteSimal: -1.7976931348623157E+10308,
      // p1:new Person('晨曦')
    }
    // obj.obj=obj
    let deepCopy = JSON.parse(JSON.stringify(obj))
    console.log('obj',obj)
    console.log('deepCopy',deepCopy)


    // 1.如果json里面有时间对象，则序列化后会将时间对象转换为字符串格式
    //obj {motto: '行则将至', date: Tue Mar 29 2022 16:47:33 GMT+0800 (中国标准时间)}
    //deepCopy {motto: '行则将至', date: '2022-03-2 9T08:47:33.399Z'}

    //  2.如果json里有 function,undefined，则序列化后会将 function,undefined 丢失

    // 3.如果json里有NaN、Infinity和-Infinity，则序列化后会变成null

    // 4.如果json里有对象是由构造函数生成的，则序列化的结果会丢弃对象的 constructor
    //obj {motto: '行则将至', p1: Person}
    //deepCopy {motto: '行则将至', p1: {…}}
    // console.log(obj.p1.__proto__.constructor===Person); //true
    // console.log(deepCopy.p1.__proto__.constructor===Person); //false
    // console.log(deepCopy.p1.__proto__.constructor===Object); //true

    // 5.如果对象中存在循环引用的情况将抛出错误
    // 例如 obj.obj = obj
  </script>
</body>
</html>